/* inquirer ： 是交互式命令行工具库，主要用于在终端（命令行）中与用户进行交互，收集用户输入的信息 */

/*  常见使用场景：
        1.收集用户输入,例如:让用户输入姓名、邮箱、城市等文本信息。
        2.提供选项选择让用户从预设的选项中选择（如单选、多选），比如选择 “实时天气” 或 “未来预报”。
        3.确认操作让用户确认是否执行某个危险操作（如 “确定要删除吗？(Y/n)”）。
        4.密码输入支持隐藏输入的字符（类似输入密码时显示 * 或不显示）。
*/

/* 典型使用流程：
        (1)npm install inquirer
        (2)第三方库导入：
                ES6 => import inquirer from 'inquirer'
                CommonJS导入 => const inquirer = require('inquirer')
        (3)使用：
                ①定义问题列表（描述交互内容）；
                ②调用 inquirer.prompt() 发起交互；
                ③处理返回结果（用户输入的信息）
*/

import inquirer from 'inquirer'

//1.定义问题：数组，每个对象对应一个交互步骤
const questions = [
    //每一个对象交互，必须具备 type 、 name 、 message 三个核心属性

    // 1. input：文本输入
    {
        //定义交互类型
        type: 'input',
        //定义结果存储的键名（后续通过 answers[name] 获取用户输入）
        name: 'name',
        //终端显示的提示文字
        message: '请输入姓名：',

        //默认值设置
        default: '游客',
        //校验：姓名不能为空
        validate: (value) => {
            //value.trim() === '' 是一个用于判断字符串是否为空
            //trim()：字符串的内置方法，作用是去除字符串两端的空白字符
            if (value.trim() === '') {
                return '姓名不能为空！'
            }
            return true
        }
    },

    // 2. list：单选列表
    {
        type: 'list',
        name: 'weatherType',
        message: '请选择查询类型：',

        //设置选项
        choices: ['实时天气', '未来3天预报', '未来7天预报'],
        // 关闭循环滚动
        loop: false
    },

    // 3. checkbox：多选列表
    {
        type: 'checkbox',
        name: 'features',
        message: '需要显示的天气信息：',

        //设置选项
        choices: [
            { name: '温度', value: 'temp' },
            { name: '风向', value: 'wind' },
            { name: '湿度', value: 'humidity', checked: true } // 默认选中
        ]
    },

    // 4. confirm：确认
    {
        type: 'confirm',
        name: 'isSave',
        message: '是否保存当前配置？',

        default: false
    },

    // 5. 条件显示（when）：
    {
        type: 'input',
        name: 'saveName',
        message: '请输入配置名称：',

        //条件显示（when）：仅当 isSave 为 true 时显示
        when: (answers) => answers.isSave  // 依赖前序问题的结果
    }
]

//2. 发起交互（返回 Promise）
inquirer.prompt(questions).then(answers => {
    console.log('\n用户选择结果：', answers)
})


/* 问题配置核心属性：
                属性名	  作用	                                                       适用场景
        必选	type	  定义交互类型（如输入框、单选列表、确认框等）	                   所有问题
        必选	name	  定义结果存储的键名（后续通过 answers[name] 获取用户输入）	       所有问题
        必选	message	  终端显示的提示文字（告诉用户需要输入 / 选择什么）	               所有问题
        可选	filter	  输入处理函数（对用户输入的值进行格式化 / 转换，如转大写、转数字）	 所有问题
        可选	default	  设置默认值（用户直接回车时自动使用该值）	                       输入类（input/number等）
        可选	validate  输入校验函数（判断用户输入是否合法，不合法则提示错误）	        输入类（input/password等）
        可选	choices	  定义选项列表（如单选 / 多选的可选项）	                          选择类（list/checkbox等）
        可选	when	  条件判断函数（返回 true 才显示当前问题，实现 “动态显示问题”）	    依赖前序问题结果的场景
        可选	loop	  是否允许选项循环滚动（list 类型默认 true，设为 false 关闭）	   list 类型
*/

/* type配置：
        类型	      作用描述
        input	     文本输入框，用于收集普通文本（如姓名、城市）
        number	     数字输入框，仅允许输入数字（自动转换为 Number 类型）
        password	 密码输入框，输入内容会被隐藏（显示 * 或不显示）
        list	     单选列表，用户通过上下键选择一个选项（只能选一个）
        checkbox	 多选列表，用户通过空格选择多个选项（支持全选 / 反选）
        confirm	     确认框，用户通过 Y/n 选择（返回布尔值 true/false）
        rawlist	     带编号的单选列表（选项前显示序号，可通过数字直接选择）
        expand	     可展开的单选列表（默认显示缩写，输入 h 显示完整选项）
 */